An important part of reading bar codes is identifying the transitions between bar code elements such as bars and spaces. Ideally, the transition would be clean and abrupt and easy to detect. More realistically, the transition is in an area of gray and its location is critical because on it depends the determination of the width of the bar code elements, the bars and spaces. In a typical bar code using black bars and white spaces the transitions would never occur in the black or in the white levels which clearly represent the bars and spaces but in the gray areas between them. But often there does occur apparent transitions in those black and white levels which, when detected as transitions, give false readings of the widths and number of the associated bars and spaces. One approach has been to simply set a threshold level in the gray scale profile above which is considered white, below which is considered black. This works if the bar code signal is sharp and the bars and spaces are large enough so that a high level of black or white is attained. That is, the gray transition areas are small compared to the full black or white of the bars or spaces and the bar or space reaches, at least in its middle portion, a level of white or black which is beyond the threshold. However, when the bars and spaces are small, the middle portion shrinks and the gray transition areas encroach on the bar or space itself so that even though it is actually black or white it appears as mostly gray and does not exceed the threshold and so is not read correctly. One attempt to overcome this uses a floating threshold level but this too can produce errors.